package com.example.shop.user.listener;

import com.example.shop.pojo.User;
import com.example.shop.redis.service.LettuceClient;
import com.example.shop.common.enums.SessionAttributeKey;
import com.example.shop.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.*;
import java.util.HashMap;
import java.util.Map;

@Component
@WebListener
public class UserSessionListener implements HttpSessionListener, HttpSessionAttributeListener {
//    public static Map<String,HttpSession> sessionMap = new HashMap<>();
    @Autowired
    LettuceClient lettuceClient;
    @Autowired
    UserService userService;

    /**
     * 添加k-v到session中时，会触发该方法
     * @param se 封着一个添加的k-v，和该session对象
     */
    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
    }

    /**
     * 移除k-v到session中时，会触发该方法
     * @param se 封着一个移除的k-v，和该session对象
     */
    @Override
    public void attributeRemoved(HttpSessionBindingEvent se) {
    }
    /**
     * k-v在该session中被替换后，会触发该方法
     * @param se 封着一个被替换的k-v(即是替换前的k-v)，和该session对象(里面的该k已经被替换了)
     */
    @Override
    public void attributeReplaced(HttpSessionBindingEvent se) {
    }

    /**
     * session创建时调用该方法
     * @param se
     */
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("user模块||session创建");
        //这里的session不能保存起来，因为这里的session跟redis里缓存的session是不一样的
    }
    /**
     * session销毁时调用该方法
     * @param se
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        User user = (User) session.getAttribute(SessionAttributeKey.NOW_LOGIN_USER.getKey());
        session.removeAttribute(SessionAttributeKey.NOW_LOGIN_USER.getKey());
        userService.loginOut(user);
    }
}
